package jp.bsws.interceptor;

/*
 * ログインインターセプター
 */
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import jp.bsws.bl.BSWSBl;
import jp.bsws.common.BSWSConstants;
import jp.bsws.common.BSWSSession;
import jp.bsws.common.BSWSUtils;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/*
 * ログイン処理を実現したインターセプター
 */
public class LoginInterceptor extends AbstractInterceptor {
	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger(LoginInterceptor.class.getName());

	public void init() {}
	public void destroy () {}

	public String intercept(ActionInvocation invocation) throws Exception {
		// 通常、セッション取得は以下の方法でできますが、
		//   Map<String, String> session = ActionContext.getContext().getSession();
		// ここでは、低レベルなクラス(HttpSession)を使って、セッションを取得しています。
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = ServletActionContext.getRequest().getSession();

		// URLパラメタのmail_addressとpassword_codを取得。
		String strMailAddress = request.getParameter("mail_address");
		String strPassWord = request.getParameter("password_cod");

		if ( BSWSUtils.isNotBlankNull(strMailAddress)  && BSWSUtils.isNotBlankNull(strPassWord)  ){
			// パラメタの指定があった場合には、ログイン画面での認証チェックとみなして、認証チェック処理を行う。
			BSWSBl bSWSBl = new BSWSBl();
			String strSansyoYmd = BSWSUtils.getSysDateYmd();
			BSWSSession bSWSSession = bSWSBl.getLoginJoho(strMailAddress, strPassWord, strSansyoYmd);
			if ( BSWSUtils.isBlankNull(bSWSSession.getStrErrorMsg()) ){
				// ユーザＩＤが存在しており、かつパスワードも一致していたら認証ＯＫ
				// 既存セッションを破棄し、新規セッションを取得。(セッション固定攻撃を回避するため)
				// 新規セッションに、mail_addressを設定する。
				ServletActionContext.getRequest().getSession(true).invalidate();
				HttpSession newsession = ServletActionContext.getRequest().getSession(true);
				newsession.setAttribute(BSWSConstants.KEY_SESSION, bSWSSession );
				// メニュー画面に遷移する。
				return "top";
			} else {
				// ユーザ認証ＮＧの場合は、エラーメッセージを設定してログイン画面に遷移。
				// ここで設定したメッセージは、JSP内に<s:actionerror /> を記述することで出力可能。
				if ( invocation.getAction() instanceof ValidationAware){
					((ValidationAware) invocation.getAction()).addActionError( bSWSSession.getStrErrorMsg());
				}
				return "login";
			}
		} else {
			// パラメタの指定がない場合（つまり通常画面の場合）
			if ( null == session.getAttribute(BSWSConstants.KEY_SESSION) ){
				// 通常画面へのアクセスなのに未ログインの場合には、ログイン画面に遷移する。
				return "login";
			} else {
				// ログイン済みの場合には、以後のinterceptor処理に進む。
				return invocation.invoke();
			}
		}
	}
}